package ooday.ooday4;

public class PolymorphicDemo {
    public static void main(String[] args) {
        //演示向上造型:
        //向上造型是为了复用
        /*
        Dog o1 = new Dog("小黑",2,"黑");    //狗是狗
        //o1.name/age/color/drink()/eat()/swim()/lookHome()
        Animal o2 = new Dog("小黑",2,"黑"); //狗是动物-----向上造型
        //o2.name/age/color/drink()/eat();
        Swim o3 = new Dog("小黑",2,"黑");   //狗会游泳
        //o3.swim();
         */

        //演示向上造型(多态)的第1点应用:
        /*
        Master master = new Master();
        Dog dog = new Dog("小黑",2,"黑");
        Chick chick = new Chick("小花",3,"花");
        Fish fish = new Fish("小金",1,"金");
        master.feed(dog); //在传参的同时，系统自动做了向上造型
        master.feed(chick);
        master.feed(fish);
         */

        //演示向上造型(多态)的第2点应用:
        //Animal o = new Animal(); //编译错误，抽象类不能被实例化
        Animal[] animals = new Animal[5];
        animals[0] = new Dog("小黑", 2, "黑"); //向上造型
        animals[1] = new Dog("小白", 1, "白");
        animals[2] = new Fish("小金", 1, "金");
        animals[3] = new Fish("小花", 2, "花");
        animals[4] = new Chicken("小灰", 3, "灰");
        for (int i = 0; i < animals.length; i++) { //遍历所有动物
            System.out.println(animals[i].name); //输出每个动物的名字
            animals[i].drink(); //每个动物喝水
            animals[i].eat(); //每个动物吃饭

            if (animals[i] instanceof Dog) {
                Dog dog = (Dog) animals[i];
                dog.lookHome();
            }
            if (animals[i] instanceof Chicken) {
                Chicken chick = (Chicken) animals[i];
                chick.layEggs();
            }
            if (animals[i] instanceof Swim) { //适用于所有实现Swim接口的(会游泳的)
                Swim s = (Swim) animals[i];
                s.swim();
            }
        }

        //向下转型/演示强转成功的条件:
       //引用所指向的对象，就是该 类型
        //引用所指向的对象，实现了该接口或继承了该类
        /*
        Animal o = new Dog("小黑", 2, "黑"); //向上造型
        Dog g = (Dog) o; //引用o所指向的对象，就是Dog类型
        Swim s = (Swim) o; //引用o所指向的对象，实现了Swim接口
        //Fish f = (Fish)o; //运行时会发生ClassCastException类型转换异常

        System.out.println(o instanceof Dog);  //true
        System.out.println(o instanceof Swim); //true
        System.out.println(o instanceof Fish); //false
        if (o instanceof Fish) { //false
            Fish f = (Fish) o;
        } else {
            System.out.println("o不是Fish类型");
        }
        */

    }
}

